package com.rgs.base.database;

import cn.hutool.core.bean.BeanUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.base.Strings;
import com.rgs.base.core.page.IPageRequestModel;
import com.rgs.base.core.page.PageResponseModel;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;

/**
 * @author Ren Gaoshuai
 * @ClassName DataPageUtil
 * @Description 数据分页工具类
 * @date 2022-01-18 9:58
 * <p>
 * 主要功能：
 * 1.初始化分页请求进行设置每页行数，排序字段等
 * 2.构建分页响应，设置数据 当前页数 总数据数等
 * 3.封装DAO层返回的数据为PageInfo类型
 **/
public class DataPageUtil {

    /**
     * 初始化分页请求对象
     *
     * @param pageRequestModel 分页请求模型
     * @param defaultOrderBy   排序字段
     * @return 增强的分页请求
     */
    public static IPageRequestModel initPageRequestModel(IPageRequestModel pageRequestModel
            , String defaultOrderBy) {
        if (Objects.isNull(pageRequestModel.getPage())) {
            pageRequestModel.setPage(1);
        }
        if (Objects.isNull(pageRequestModel.getPerPage())) {
            pageRequestModel.setPerPage(50);
        }
        if (Strings.isNullOrEmpty(pageRequestModel.getOrderBy())) {
            pageRequestModel.setOrderBy(defaultOrderBy);
        }
        return pageRequestModel;
    }

    /**
     * 将数据转成pageinfo
     *
     * @param pageRequestModel 分页请求模型
     * @param supplierMethod   数据提供者
     * @param <T>              数据类型
     * @return pageinfo对象
     */
    public static <T> PageInfo<T> selectPageList(IPageRequestModel pageRequestModel,
                                                 Supplier<List<T>> supplierMethod) {
        return selectPageList(pageRequestModel, null, supplierMethod);
    }

    /**
     * 将数据转成pageinfo
     *
     * @param pageRequestModel 分页请求模型
     * @param defaultOrderBy   排序字段
     * @param supplierMethod   数据提供者
     * @param <T>              数据类型
     * @return pageinfo对象
     */
    public static <T> PageInfo<T> selectPageList(IPageRequestModel pageRequestModel,
                                                 String defaultOrderBy,
                                                 Supplier<List<T>> supplierMethod) {

        pageRequestModel = initPageRequestModel(pageRequestModel, defaultOrderBy);
        //开始分页
        PageHelper.startPage(pageRequestModel.getPage(), pageRequestModel.getPerPage(), pageRequestModel.getOrderBy());
        List<T> ts = supplierMethod.get();
        PageInfo<T> pageInfo = new PageInfo<>(ts);
        PageHelper.clearPage();
        return pageInfo;

    }

    /**
     * 封装分页响应对象
     *
     * @param pageInfo pageinfo
     * @param <T>      数据类型
     * @return 分页返回对象
     */
    public static <T> PageResponseModel<T> buildResponseModel(PageInfo<T> pageInfo) {
        return buildResponseModel(pageInfo, pageInfo.getList());
    }


    /**
     * 封装分页响应对象
     *
     * @param pageInfo pageinfo
     * @param dataList 数据集合
     * @param <T1>
     * @param <T2>
     * @return 分页返回对象
     */
    public static <T1, T2> PageResponseModel<T2> buildResponseModel(PageInfo<T1> pageInfo,
                                                                    List<T2> dataList) {
        PageResponseModel<T2> pageResponseModel = new PageResponseModel<>();

        //当前页号
        pageResponseModel.setPage(pageInfo.getPageNum());
        //总页数
        pageResponseModel.setTotalPage(pageInfo.getPages());
        //总数据数
        pageResponseModel.setCount(pageInfo.getTotal());
        //数据
        pageResponseModel.setDataList(dataList);

        return pageResponseModel;
    }

    /**
     * 根据类型返回分页响应对象
     *
     * @param pageInfo
     * @param clazz
     * @param <T1>
     * @param <T2>
     * @return
     */
    public static <T1, T2> PageResponseModel<T2> buildResponseModel(PageInfo<T1> pageInfo, Class<T2> clazz) {
        List<T2> objList = new ArrayList<>(pageInfo.getList().size());
        for (T1 objectTemp : pageInfo.getList()) {
            objList.add(BeanUtil.copyProperties(objectTemp, clazz));
        }
        return buildResponseModel(pageInfo, objList);
    }
}
